package myjava.j_innerClass.a_NonStaticInnerClass;

/**
 * @Auther: cty
 * @Date: 2020/6/25 17:30
 * @Description: 非静态内部类
 * @version: 1.0
 */

/**
 * 外部类以外的类
 */
class Test{
    public static void main(String[] args) {
        // 外部类以外的地方 访问 非静态内部类的实例成员
        Outer.Inner inner = new Outer().new Inner();
        inner.innerInstanceMethod();
        int a = inner.innerInstanceField;
    }
}


/**
 * 外部类
 */
class Outer {
    private int outerInstanceField;
    private static int outerStaticField;

    public void outerInstanceMethod(){
        // 外部类实例成员中 访问 非静态内部类的实例成员
        Inner inner = new Inner();
        inner.innerInstanceMethod();
        int b = inner.innerInstanceField;
    }

    public static void outerStaticMethod(){
        // 外部类静态成员中 不能访问 非静态内部类的实例成员！
        // 非静态内部类对象的创建，依赖外部类的对象，因此非静态内部类的对象不能在外部类的静态成员中创建
//        Inner inner = new Inner();
//        inner.innerInstanceMethod();
//        int b = inner.innerInstanceField;
    }


    /**
     * 非静态内部类
     */
    public class Inner {
        public int innerInstanceField;

        public void innerInstanceMethod(){
            // 非静态内部类实例成员中 访问 外部类静态成员
            outerStaticMethod();
            int a = outerStaticField;

            // 非静态内部类实例成员中 访问 外部类实例成员
            outerInstanceMethod();
            int b = outerInstanceField;
        }

    }  // end Inner{}

}  // end Outer{}
